void _gdk_window_invalidate_for_expose (GdkWindow *window,
cairo_region_t *region);
-gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
- int width,
- int height);
-
GdkWindow * _gdk_window_find_child_at (GdkWindow *window,
int x, int y);
GdkWindow * _gdk_window_find_descendant_at (GdkWindow *toplevel,
_gdk_window_add_damage (window, area);
}
+static cairo_surface_t *
+gdk_offscreen_window_resize_cairo_surface (GdkWindow *window,
+ cairo_surface_t *surface,
+ gint width,
+ gint height)
+{
+ /* No-op. The surface gets resized in
+ * gdk_offscreen_window_move_resize_internal().
+ */
+ return surface;
+}
+
/**
* gdk_offscreen_window_set_embedder:
* @window: a #GdkWindow
iface->get_root_coords = gdk_offscreen_window_get_root_coords;
iface->get_device_state = gdk_offscreen_window_get_device_state;
iface->destroy = gdk_offscreen_window_destroy;
+ iface->resize_cairo_surface = gdk_offscreen_window_resize_cairo_surface;
}
recompute_visible_regions_internal (private->parent, TRUE, FALSE, FALSE);
}
- if (private->cairo_surface &&
- (!gdk_window_has_impl (private) ||
- !_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
- private->width,
- private->height)))
+ if (private->cairo_surface && gdk_window_has_impl (private))
{
- gdk_window_drop_cairo_surface (private);
+ GdkWindowImplIface *iface = GDK_WINDOW_IMPL_GET_IFACE (private->impl);
+
+ private->cairo_surface = iface->resize_cairo_surface (private->impl,
+ private->cairo_surface,
+ private->width,
+ private->height);
}
+ else if (private->cairo_surface)
+ gdk_window_drop_cairo_surface (private);
}
/* Call this when private has changed in one or more of these ways:
void (* destroy) (GdkWindow *window,
gboolean recursing,
gboolean foreign_destroy);
+
+ cairo_surface_t * (* resize_cairo_surface) (GdkWindow *window,
+ cairo_surface_t *surface,
+ gint width,
+ gint height);
};
/* Interface Functions */
CGContextRef cg_context;
} GdkQuartzCairoSurfaceData;
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
- int width,
- int height)
-{
- /* This is not supported with quartz surfaces. */
- return FALSE;
-}
-
static void
gdk_quartz_cairo_surface_destroy (void *data)
{
}
}
+static cairo_surface_t *
+gdk_window_quartz_resize_cairo_surface (GdkWindow *window,
+ cairo_surface_t *surface,
+ gint width,
+ gint height)
+{
+ /* Quartz surfaces cannot be resized */
+ cairo_surface_destroy (surface);
+
+ return NULL;
+}
+
void
_gdk_windowing_window_destroy_foreign (GdkWindow *window)
{
iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
iface->translate = _gdk_quartz_window_translate;
iface->destroy = _gdk_quartz_window_destroy;
+ iface->resize_cairo_surface = gdk_window_quartz_resize_cairo_surface;
}
return impl->cairo_surface;
}
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
- gint width,
- gint height)
-{
- // Do nothing. The surface size is determined by the DC
- return FALSE;
-}
-
HGDIOBJ
gdk_win32_drawable_get_handle (GdkDrawable *drawable)
{
gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
}
+static cairo_surface_t *
+gdk_win32_window_resize_cairo_surface (GdkWindow *window,
+ cairo_surface_t *surface,
+ gint width,
+ gint height)
+{
+ /* XXX: Make Cairo surface use DC clip */
+ cairo_surface_destroy (surface);
+
+ return NULL;
+}
+
void
_gdk_windowing_window_destroy_foreign (GdkWindow *window)
{
iface->queue_antiexpose = _gdk_win32_window_queue_antiexpose;
iface->translate = _gdk_win32_window_translate;
iface->destroy = _gdk_win32_window_destroy;
+ iface->resize_cairo_surface = gdk_win32_window_resize_cairo_surface;
}
gboolean
impl->cairo_surface = NULL;
}
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
- int width,
- int height)
-{
- cairo_xlib_surface_set_size (surface, width, height);
- return TRUE;
-}
-
static cairo_surface_t *
gdk_x11_create_cairo_surface (GdkDrawable *drawable,
int width,
}
}
+static cairo_surface_t *
+gdk_window_x11_resize_cairo_surface (GdkWindow *window,
+ cairo_surface_t *surface,
+ gint width,
+ gint height)
+{
+ cairo_xlib_surface_set_size (surface, width, height);
+
+ return surface;
+}
+
void
_gdk_windowing_window_destroy_foreign (GdkWindow *window)
{
iface->queue_antiexpose = _gdk_x11_window_queue_antiexpose;
iface->translate = _gdk_x11_window_translate;
iface->destroy = _gdk_x11_window_destroy;
+ iface->resize_cairo_surface = gdk_window_x11_resize_cairo_surface;
}
static Bool